package com.util;

import java.util.ArrayList;
import java.util.List;

/**
 * 九宫格算法实现
 * @author fengbo
 *
 */
public class NineUtil {
	static Integer [][] nubers = null;
	public static Integer[][] getNubers() {
		return nubers;
	}
	public static void setNubers(Integer[][] nubers) {
		NineUtil.nubers = nubers;
	}
	public NineUtil(){
		nubers = new Integer[][] {   
			    {9, 0, 5, 0, 0, 0, 0, 0, 8},   
			    {4, 0, 0, 5, 7, 0, 1, 0, 6},     
			    {0, 2, 7, 6, 0, 0, 0, 4, 0},   
			    {0, 9, 6, 0, 0, 3, 5, 1, 2},   
			    {7, 0, 4, 0, 1, 0, 3, 0, 0},     
			    {2, 1, 0, 9, 8, 0, 0, 0, 4},
			    {0, 8, 1, 0, 0, 4, 0, 9, 0},   
			    {3, 0, 0, 8, 0, 0, 0, 5, 1},     
			    {0, 0, 2, 0, 0, 7, 0, 6, 0}
			};   
	}
	/**
	 * 遍历填充数字(总体思路：按单元格排除法)
	 * @param array
	 * @return
	 */
	public void fillTrim(){		
		 for (int i = 0; i < nubers.length; i++) {
			Integer[] d = nubers[i];
			for(int j = 0;j<d.length;j++){
				Integer f = nubers[i][j];
				if(new Integer(0).equals(f)){
					//获得当前格 所在行 可以填充的数字的集合
					List<Integer> ls = this.getColNuber(i);
					//获得当前单元格 所在列 中不能填充的数字的集合
					List<Integer> nls = this.getRowNuber(j);
					//排除不能填充的数字
					ls.removeAll(nls);
					if(ls.size()==1){
						nubers[i][j] = ls.get(0);
					}
				}
			}
		}
	}
	/**
	 * 获得横行中可以填充的数字 (参数: 行号)
	 * @return
	 */
	public List<Integer> getColNuber(int row){
		//获得当前行中已知道的数字
		Integer [] c = nubers[row];
		List<Integer> rs = new ArrayList();
		rs.add(1);rs.add(2);rs.add(3);rs.add(4);rs.add(5);rs.add(6);rs.add(7);rs.add(8);rs.add(9);
		for(int i=0;i<c.length;i++){
			if(rs.contains(c[i])){rs.remove(c[i]);}
		}		
		return rs;
	}
	/**
	 * 获得纵行中 不可以 填充的数字
	 * @return
	 */
	public List<Integer> getRowNuber(int col){
		List<Integer> rs = new ArrayList();
		for (int i = 0; i < nubers.length; i++) {
			Integer[] d = nubers[i];
			if(!new Integer(0).equals(d[col])){
				rs.add(d[col]);
			}
		}
		return rs;
	}
	/**
	 * 获得小格中 已填充数字（当前格中 不可以 填充的数字）
	 * @return
	 */
	public List<Integer> getRouNuber(int row, int col){
		List<Integer> list = new ArrayList();
		//获得当前单元格所在的小九宫格
		if(row>=0&&row<=2){
			if(col>=0&&col<=2){//第一个小九格
				 
			}else if(col>=3&&col<=5){ //第二个九格
				
			}else{ //第三个九格
				
			}
		}else if(row>=3&&row<=5){
			if(col>=0&&col<=2){//第四个小九格
				
			}else if(col>=3&&col<=5){ //第五个九格
				
			}else{ //第六个九格
				
			}
		}else{
			if(col>=0&&col<=2){//第七个小九格
				
			}else if(col>=3&&col<=5){ //第八个九格
				
			}else{ //第九个九格
				
			}
		}
		return null;
	}
	/**
	 * 获得小九格内的所有非0数据
	 * @param start
	 * @param end
	 * @return
	 */
	private List<Integer> getIter(int start,int end){
		 for (int i = 0; i < nubers.length; i++) {
				Integer[] d = nubers[i];
				for(int j = 0;j<d.length;j++){
					
				}
		 }
		return null;
	}
	
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		NineUtil util = new NineUtil();
		int c = 0;
		do{
			util.fillTrim();
			c++;
		}while(c<10);
		for (int i = 0; i < nubers.length; i++) {
			Integer[] d = nubers[i];
			for(int j = 0;j<d.length;j++){
				System.out.print(nubers[i][j]+"  ");
			}
			System.out.println();
		}

	}
	

}
